// 有一个employee_data.txt文本文件存储着员工的基本信息
// 现需要通过转换RDD的方式得到DataFrame并做相应的数据分析

// 步骤一：创建并加载数据
//     • 使用Spark读取上述文本文件，创建一个RDD。
//     • 显示原始RDD的前几行数据以验证数据加载正确。

val spark = SparkSession.builder()
  .appName("RDD to DataFrame")
  .master("local")
  .getOrCreate()

val rawTextRDD = spark.sparkContext.textFile("employee_data.txt")
rawTextRDD.take(5).foreach(println)

// 步骤二：将RDD转换为DataFrame
//     • 将原始文本RDD转换为DataFrame，通过反射机制自动推导Schema（或手动定义Schema）。
//     • 显示转换后的DataFrame的表结构和前几行数据。
case classEmployee(id: Int, name: String, age: Int, gender: String,joinDate: String)

val employeeRDD = rawTextRDD.map(_.split(",")).map(p => Employee(p(0).toInt, p(1), p(2).toInt, p(3), p(4))).toDF()
employeeRDD.printSchema()
employeeRDD.show(5)

// 步骤三：DataFrame操作
// 使用DataFrame API进行数据清洗和分析操作：将“入职日期”列转换为日期类型。
//     • 计算公司员工的平均年龄。
//     • 按性别分组统计员工数量。

import org.apache.spark.sql.functions._

// 转换日期
val dateFormattedDF = employeeRDD.withColumn("joinDate", to_date(col("joinDate"), "yyyy-MM-dd"))
// 计算平均年龄
val avgAge = dateFormattedDF.agg(avg("age")).head.getAs[Double](0)
println(s"Average age of employees: $avgAge")
// 按性别分组统计员工数量
val genderCountDF = dateFormattedDF.groupBy("gender").count()
groupCountDF.show()
// 查询女性员工数量
val femaleCount = dateFormattedDF.filter(col("gender") === "F").select(col("count")).head.getInt(0)
println(s"The number of female-employees: $avgAge")
